﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplicationGDI3._1
{
    public partial class Form1 : Form
    {
        public int Direction = 0;
        public int x = 0;
        public int y = 0;
        bool zet = false;
        int dop = 0;
        char dopVar;

        public Form1()
        {
            InitializeComponent();
            animSprite = new AnimatedSprite("sr1.bmp", 6, 5, false);
        }

        AnimatedSprite animSprite;
        //Bitmap img = Bitmap.FromFile("C:\\Desert.bmp") as Bitmap;

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            using (Graphics gr = e.Graphics)
            {
                Pen p = new Pen(Color.DimGray);
                Brush b = new HatchBrush(HatchStyle.HorizontalBrick, Color.Aqua);
                Brush b1 = new HatchBrush(HatchStyle.Cross, Color.Azure);
                animSprite.SetLine(Direction);

                Rectangle reg = new Rectangle(new Point(110, 220), new Size(50, 90));
                Rectangle reg2 = new Rectangle(new Point(500, 300), new Size(90, 50));
                Rectangle reg1 = new Rectangle(new Point(x, y), new Size(120, 120));

                Region r1 = new Region(reg);
                Region r2 = new Region(reg1);
                Region r3 = new Region(reg2);

                Region rt = r1.Clone();
                Region rt1 = r2.Clone();
                Region rt2 = r3.Clone();

                if (Direction == 2)
                {
                    x += 1;
                }
                if (Direction == 1)
                {
                    x -= 1;
                }
                if (Direction == 0)
                {
                    y += 1;
                }
                if (Direction == 3)
                {
                    y -= 1;
                }

                gr.DrawRectangle(p, reg);
                gr.DrawRectangle(p, reg2);
                //gr.FillRegion(b, rt);
                gr.FillRectangle(b, reg);
                r1.Xor(r2);
                r3.Xor(r2);
                rt.Intersect(r2);
                rt2.Intersect(r2);
                //gr.FillRegion(b1, rt1);

                gr.DrawImage(animSprite.Image, new Rectangle(x,y, 120, 120), animSprite.GetAnimationFrame(), GraphicsUnit.Pixel);
                if (!rt.IsEmpty(gr) || !rt2.IsEmpty(gr))  // безконечность
                {
                    if (zet == false)
                    {
                        dop = Direction;
                    }
                    Direction = 4;

                    if (dop == 0) dopVar = 's';
                    if (dop == 1) dopVar = 'a';
                    if (dop == 2) dopVar = 'd';
                    if (dop == 3) dopVar = 'w';

                    zet = true;
                }

                gr.Dispose();
            }

            //grp.DrawImageUnscaledAndClipped(img, new Rectangle(10, 10, /*img.Width, img.Height*/ 550, 550));    // если rectangle будет задан меньше. то картинка будет обрезана
            //grp.DrawImageUnscaled(img, new Point(100, 100));    // не обрезает картинку если она оказывается больше
            //Point[] pts = {new Point(5,5), new Point (200, 5), new Point (100, 150)};
            //grp.DrawImage(img, pts);
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            Invalidate();
        }

        private void Form1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (zet != true)
            {
                if (e.KeyChar == 'a')
                {
                    Direction = 1;
                }
                if (e.KeyChar == 'd')
                {
                    Direction = 2;
                }
                if (e.KeyChar == 's')
                {
                    Direction = 0;
                }
                if (e.KeyChar == 'w')
                {
                    Direction = 3;
                }
                if (e.KeyChar == (char)Keys.Space)
                {
                    Direction = 4;
                }
            }
            else
            {
                if (e.KeyChar != dopVar)
                {
                    if (e.KeyChar == 'a')
                    {
                        Direction = 1;
                        if (dopVar == 's') y -= 2;
                        if (dopVar == 'w') y += 2;
                        x -= 2;
                    }
                    if (e.KeyChar == 's')
                    {
                        Direction = 0;
                        if (dopVar == 'a') x += 2;
                        if (dopVar == 'd') x -= 2;
                        y += 2;
                    }
                    if (e.KeyChar == 'w')
                    {
                        Direction = 3;
                        if (dopVar == 'a') x += 2;
                        if (dopVar == 'd') x -= 2;
                        y -= 2;
                    }
                    if (e.KeyChar == 'd')
                    {
                        Direction = 2;
                        if (dopVar == 's') y -= 2;
                        if (dopVar == 'w') y += 2;
                        x += 2;
                    }
                    zet = false;
                }
            }
        }
    }
}

/*
 * от image наследуется класс bitmap (попиксельный формат изображения). изображение не сжатое и занимает много памяти.
 * metafile (векторный формат хранения GDI). wmf (поддерж виндовс, но не поддерживается GDI)
 * amf (корректно работает с DGI).
 * 
 * 
 * На форме две кнопки -туда сюда.
*/
